package com.hanhai.material.device.controller;

import com.hanhai.material.common.result.Result;
import com.hanhai.material.common.result.ResultTool;
import com.hanhai.material.device.entity.SysMachinePlc;
import com.hanhai.material.device.service.SysMachinePlcService;
import com.hanhai.material.model.machine.MachineModel;
import com.mybatisflex.core.paginate.Page;
import com.mybatisflex.core.query.QueryWrapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.io.Serializable;
import java.util.List;

import static com.hanhai.material.device.entity.table.SysMachinePlcTableDef.SYS_MACHINE_PLC;
import static com.mybatisflex.core.query.QueryMethods.distinct;

/**
 *  控制层。
 *
 * @author youchuang
 * @since 2023/10/18 11:26:03
 */
@RestController
@RequestMapping("/sysMachinePlc")
public class SysMachinePlcController {

    @Autowired
    private SysMachinePlcService sysMachinePlcService;

    /**
     * 添加。
     *
     * @param sysMachinePlc
     * @return {@code true} 添加成功，{@code false} 添加失败
     */
    @PostMapping("save")
    public boolean save(@RequestBody SysMachinePlc sysMachinePlc) {
        return sysMachinePlcService.save(sysMachinePlc);
    }

    /**
     * 根据主键删除。
     *
     * @param id 主键
     * @return {@code true} 删除成功，{@code false} 删除失败
     */
    @DeleteMapping("remove/{id}")
    public boolean remove(@PathVariable Serializable id) {
        return sysMachinePlcService.removeById(id);
    }

    /**
     * 根据主键更新。
     *
     * @param sysMachinePlc
     * @return {@code true} 更新成功，{@code false} 更新失败
     */
    @PutMapping("update")
    public boolean update(@RequestBody SysMachinePlc sysMachinePlc) {
        return sysMachinePlcService.updateById(sysMachinePlc);
    }

    /**
     * 查询所有。
     *
     * @return 所有数据
     */
    @GetMapping("list")
    public Result<?> list() {
        QueryWrapper queryWrapper=QueryWrapper.create();
        queryWrapper.orderBy(SYS_MACHINE_PLC.MACHINE_NAME,true);
        List<SysMachinePlc> sysMachinePlcList=this.sysMachinePlcService.getMapper().selectListWithRelationsByQuery(queryWrapper);
        return sysMachinePlcList.isEmpty()?ResultTool.fail():ResultTool.success(sysMachinePlcList);
    }

    @PostMapping("/reason/list/{workShopName}/{lineManager}")
    public Result<?> getReasonMachineList(@PathVariable String workShopName,@PathVariable String lineManager){
        QueryWrapper queryWrapper=QueryWrapper.create();
        queryWrapper.select(distinct(SYS_MACHINE_PLC.MACHINE_AREA).as("name"),SYS_MACHINE_PLC.MACHINE_AREA.as("label"));
        queryWrapper.where(SYS_MACHINE_PLC.LINE_MANAGER_A.like(lineManager).or(SYS_MACHINE_PLC.LINE_MANAGER_B.like(lineManager)));
        queryWrapper.orderBy(SYS_MACHINE_PLC.MACHINE_AREA,true);
        List<MachineModel> machineList=this.sysMachinePlcService.listAs(queryWrapper, MachineModel.class);
        if(machineList.isEmpty()){
            return ResultTool.fail();
        }
        for(MachineModel machine:machineList){
            queryWrapper=QueryWrapper.create();
            queryWrapper.select(distinct(SYS_MACHINE_PLC.MACHINE_NAME).as("name"),SYS_MACHINE_PLC.MACHINE_NAME.as("label"));
            queryWrapper.where(SYS_MACHINE_PLC.MACHINE_AREA.eq(machine.getName()));
            queryWrapper.where(SYS_MACHINE_PLC.LINE_MANAGER_A.like(lineManager).or(SYS_MACHINE_PLC.LINE_MANAGER_B.like(lineManager)));
            queryWrapper.orderBy(SYS_MACHINE_PLC.MACHINE_NAME,true);
            List<MachineModel> machineList1=this.sysMachinePlcService.listAs(queryWrapper, MachineModel.class);
            machine.setChildren(machineList1);
        }
        return ResultTool.success(machineList);
    }
    /**
     * 根据主键获取详细信息。
     *
     * @param id 主键
     * @return 详情
     */
    @GetMapping("getInfo/{id}")
    public SysMachinePlc getInfo(@PathVariable Serializable id) {
        return sysMachinePlcService.getById(id);
    }

    /**
     * 分页查询。
     *
     * @param page 分页对象
     * @return 分页对象
     */
    @GetMapping("page")
    public Page<SysMachinePlc> page(Page<SysMachinePlc> page) {
        return sysMachinePlcService.page(page);
    }

}
